@echo off
REM 校园视频孪生系统后端虚拟环境设置脚本 (Windows版本)

setlocal enabledelayedexpansion

REM 颜色定义
set "RED=[ERROR]"
set "GREEN=[SUCCESS]"
set "YELLOW=[WARNING]"
set "BLUE=[INFO]"

REM 默认参数
set "PYTHON_VERSION=3.9"
set "VENV_NAME=venv"
set "FORCE_RECREATE=false"
set "INSTALL_DEV=false"

REM 显示帮助信息
:show_help
echo 校园视频孪生系统后端虚拟环境设置脚本 (Windows版本)
echo.
echo 用法: %0 [选项]
echo.
echo 选项:
echo     /h, /help              显示帮助信息
echo     /python ^<version^>      指定Python版本 (默认: 3.9)
echo     /name ^<name^>           虚拟环境名称 (默认: venv)
echo     /force                 强制重新创建虚拟环境
echo     /dev                   安装开发依赖
echo.
echo 示例:
echo     %0                     使用默认设置创建虚拟环境
echo     %0 /python 3.10 /dev   使用Python 3.10并安装开发依赖
echo     %0 /force              强制重新创建虚拟环境
goto :eof

REM 解析命令行参数
:parse_args
if "%~1"=="" goto :check_params
if /i "%~1"=="/h" goto :show_help
if /i "%~1"=="/help" goto :show_help
if /i "%~1"=="/python" (
    set "PYTHON_VERSION=%~2"
    shift
    shift
    goto :parse_args
)
if /i "%~1"=="/name" (
    set "VENV_NAME=%~2"
    shift
    shift
    goto :parse_args
)
if /i "%~1"=="/force" (
    set "FORCE_RECREATE=true"
    shift
    goto :parse_args
)
if /i "%~1"=="/dev" (
    set "INSTALL_DEV=true"
    shift
    goto :parse_args
)
echo %RED% 未知参数: %~1
goto :show_help

:check_params
REM 参数验证完成，继续执行

REM 日志函数
:log_info
echo %BLUE% %~1
goto :eof

:log_success
echo %GREEN% %~1
goto :eof

:log_warning
echo %YELLOW% %~1
goto :eof

:log_error
echo %RED% %~1
goto :eof

REM 检查Python版本
:check_python
call :log_info "检查Python版本..."

python --version >temp_python_version.txt 2>&1
if errorlevel 1 (
    call :log_error "Python未安装或不在PATH中"
    exit /b 1
)

REM 读取Python版本
set /p python_version_output=<temp_python_version.txt
del temp_python_version.txt

echo 当前Python版本: %python_version_output%

REM 检查版本是否符合要求 (简化检查)
echo %python_version_output% | findstr /c:"Python 3." >nul
if errorlevel 1 (
    call :log_error "需要Python 3.x版本"
    exit /b 1
)

call :log_success "Python版本检查通过"
goto :eof

REM 创建虚拟环境
:create_venv
call :log_info "创建虚拟环境: %VENV_NAME%"

REM 检查是否需要删除现有虚拟环境
if exist "%VENV_NAME%" (
    if /i "%FORCE_RECREATE%"=="true" (
        call :log_warning "删除现有虚拟环境..."
        rmdir /s /q "%VENV_NAME%"
    ) else (
        call :log_warning "虚拟环境已存在，使用 /force 参数强制重新创建"
        goto :activate_venv
    )
)

REM 创建新的虚拟环境
python -m venv "%VENV_NAME%"
if errorlevel 1 (
    call :log_error "创建虚拟环境失败"
    exit /b 1
)

call :log_success "虚拟环境创建成功"
goto :eof

REM 激活虚拟环境
:activate_venv
call :log_info "激活虚拟环境..."

if not exist "%VENV_NAME%\Scripts\activate.bat" (
    call :log_error "虚拟环境激活脚本不存在"
    exit /b 1
)

call "%VENV_NAME%\Scripts\activate.bat"
call :log_success "虚拟环境已激活"
goto :eof

REM 升级pip
:upgrade_pip
call :log_info "升级pip..."

python -m pip install --upgrade pip
if errorlevel 1 (
    call :log_warning "pip升级失败，继续安装依赖"
) else (
    call :log_success "pip升级成功"
)
goto :eof

REM 安装依赖
:install_dependencies
call :log_info "安装Python依赖..."

REM 检查requirements.txt是否存在
if not exist "requirements.txt" (
    call :log_error "requirements.txt文件不存在"
    exit /b 1
)

REM 安装基础依赖
pip install -r requirements.txt
if errorlevel 1 (
    call :log_error "安装基础依赖失败"
    exit /b 1
)

call :log_success "基础依赖安装成功"

REM 安装开发依赖
if /i "%INSTALL_DEV%"=="true" (
    if exist "requirements-dev.txt" (
        call :log_info "安装开发依赖..."
        pip install -r requirements-dev.txt
        if errorlevel 1 (
            call :log_warning "开发依赖安装失败"
        ) else (
            call :log_success "开发依赖安装成功"
        )
    ) else (
        call :log_warning "requirements-dev.txt文件不存在，跳过开发依赖安装"
    )
)
goto :eof

REM 验证安装
:verify_installation
call :log_info "验证安装..."

REM 检查关键包是否安装成功
set "key_packages=fastapi uvicorn sqlalchemy alembic"

for %%p in (%key_packages%) do (
    pip show %%p >nul 2>&1
    if errorlevel 1 (
        call :log_warning "关键包 %%p 未安装"
    ) else (
        echo   ✓ %%p 已安装
    )
)

call :log_success "安装验证完成"
goto :eof

REM 创建启动脚本
:create_start_scripts
call :log_info "创建启动脚本..."

REM 创建开发服务器启动脚本
echo @echo off > start_dev.bat
echo call %VENV_NAME%\Scripts\activate.bat >> start_dev.bat
echo python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload >> start_dev.bat
echo pause >> start_dev.bat

REM 创建生产服务器启动脚本
echo @echo off > start_prod.bat
echo call %VENV_NAME%\Scripts\activate.bat >> start_prod.bat
echo python -m uvicorn main:app --host 0.0.0.0 --port 8000 >> start_prod.bat
echo pause >> start_prod.bat

REM 创建数据库迁移脚本
echo @echo off > migrate.bat
echo call %VENV_NAME%\Scripts\activate.bat >> migrate.bat
echo alembic upgrade head >> migrate.bat
echo pause >> migrate.bat

REM 创建测试运行脚本
echo @echo off > run_tests.bat
echo call %VENV_NAME%\Scripts\activate.bat >> run_tests.bat
echo pytest tests/ -v >> run_tests.bat
echo pause >> run_tests.bat

call :log_success "启动脚本创建完成"
goto :eof

REM 显示使用说明
:show_usage
call :log_info "虚拟环境设置完成！"
echo.
echo 使用说明:
echo.
echo 1. 激活虚拟环境:
echo    %VENV_NAME%\Scripts\activate.bat
echo.
echo 2. 启动开发服务器:
echo    start_dev.bat
echo.
echo 3. 启动生产服务器:
echo    start_prod.bat
echo.
echo 4. 运行数据库迁移:
echo    migrate.bat
echo.
echo 5. 运行测试:
echo    run_tests.bat
echo.
echo 6. 停用虚拟环境:
echo    deactivate
echo.
echo 注意: 每次使用前请先激活虚拟环境！
goto :eof

REM 主函数
:main
call :log_info "开始设置校园视频孪生系统后端虚拟环境..."

REM 检查Python
call :check_python
if errorlevel 1 exit /b 1

REM 创建虚拟环境
call :create_venv
if errorlevel 1 exit /b 1

REM 激活虚拟环境
call :activate_venv
if errorlevel 1 exit /b 1

REM 升级pip
call :upgrade_pip

REM 安装依赖
call :install_dependencies
if errorlevel 1 exit /b 1

REM 验证安装
call :verify_installation

REM 创建启动脚本
call :create_start_scripts

REM 显示使用说明
call :show_usage

call :log_success "虚拟环境设置完成！"
goto :eof

REM 解析参数并执行主函数
call :parse_args %*
call :main